import router from '@/router'
import { useMenuStore } from '@/stores/menu'
import { useUserStore } from '@/stores/user'
import { useUserDetailStore } from '@/stores/userDetail'
import axios, { type AxiosRequestConfig, type AxiosResponse } from 'axios'
import { ElMessage } from 'element-plus'

// 创建axios实例 —— 基本配置
export const service = axios.create({
  baseURL: 'https://api-hmzs.itheima.net/tj',
  timeout: 10000,
})

// 请求返回类型
type Result<T> = {
  code: number
  msg: string
  data: T
}

// 封装请求
export const myRequest = <T>(options: AxiosRequestConfig) => {
  return service<AxiosResponse ,Result<T>>(options)
}
// 封装get请求
export const myGet = <T>(url: string, params?: object) => {
  return myRequest<T>({
    url,
    method: 'GET',
    params,
  })
}
// 封装post请求
export const myPost = <T>(url: string, data?: object) => {
  return myRequest<T>({
    url,
    method: 'POST',
    data,
  })
}


// 请求拦截器
service.interceptors.request.use(
  config => {
    const userStore = useUserStore() // 获取用户信息

    const token = userStore.token // 获取token
    // 设置token
    if (token) {
      config.headers.Authorization = `Bearer ${token}`
    }
    return config
  },
  error => {
    return Promise.reject(error)
  },
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    // 没有权限
    if (response.data.code === 40003) {
      ElMessage.error(response.data.msg)
      return Promise.reject(response.data.msg)
    }

    return response.data
  },
  error => {
    const userStore = useUserStore() // 获取用户信息仓库
    const userDetailStore = useUserDetailStore() // 获取用户详情仓库
    const menuStore = useMenuStore() // 获取菜单仓库

    if(error.response){

      if (error.response.status === 401) {
        ElMessage.error('用户名过期，请重新登录')

        // 跳转到登录页 - 并传递当前路由的fullPath
        router.push({
          path: '/login',
          query: {
            // 主意啊！注意！在vue3中，router.currentRoute不是响应式对象了，而是一个计算属性，要加.value
            pathStr: router.currentRoute.value.fullPath // 传递fullPath
          }
        })

        // 清除用户信息
        userStore.removeToken()
        userDetailStore.clearUserDetail()
        menuStore.clearMenuList()

      } else if (error.response.status === 500) {
        ElMessage.error('请重新登录')

        // 跳转到登录页 - 并传递当前路由的fullPath
        router.push({
          path: '/login',
          query: {
            // 主意啊！注意！在vue3中，router.currentRoute不是响应式对象了，而是一个计算属性，要加.value
            pathStr: router.currentRoute.value.fullPath // 传递fullPath
          }
        })

        // 清除用户信息
        userStore.removeToken()
        userDetailStore.clearUserDetail()
        menuStore.clearMenuList()
      } else {
        ElMessage.error(error.response.data.msg) // 提示响应的错误信息
      }
    } else {
      // 木no响应
      ElMessage.error('网络错误，请稍后重试')
    }
    return Promise.reject(error)
  },
)

export default service
